import axios from "axios";
import { useRouter } from "vue-router";

import { ElMessage } from "element-plus";
//构建Axios实例对象
const instance = axios.create({
  baseURL: "http://localhost:8080",
  timeout: 3600,
  headers: {
    "Content-Type": "application/json",
  },
  withCredentials: true,
})

const router = useRouter()

//请求拦截器
instance.interceptors.request.use(
  function (config) {
    // 在发送请求之前做些什么


    // 应用情景：用户或管理员的认证信息 Token
    const token = localStorage.getItem("token");
    if (token) {
      config.headers.Authorization = localStorage.getItem("token");
    } else {
      config.headers.Authorization = "";

      // 或者再次判断请求路径，若请求路径需要相关权限，则跳转到登录页面
      // 一般情况下，登录鉴权都是通过后端判定的，我们可以在响应拦截器中进行处理
    }
    return config;
  },
  function (error) {
    // 对请求错误做些什么
    console.error("请求拦截器错误：", error);
    return Promise.reject(error);
  }
)
//添加响应拦截器
instance.interceptors.response.use(
  function (response) {
    // 2xx 范围内的状态码都会触发该函数。
    // 请求已经发送到服务器，且服务器正常响应，并返回数据对象 R
    const r = response.data;
    // 对 R.code 进行业务状态解析
    if (r.code === 200) {
      // 业务逻辑正常
      return r;
    } else if (r.code === 401) {
      // 401: 未登录，提示去登录并跳转登录页面
      ElMessage.error("未登录，请先登录");
      // 跳转到登录页面
      // window.location.href = "/login";
      router.push("/login");
    } else if (r.code === 403) {
      // 403: 无访问权限，拒绝访问
      ElMessage.error("无访问权限");
    } else {
      // 业务逻辑异常
      ElMessage.error(r.msg);
    }
    // 所有非 200 的业务状态码均视之为异常
    return Promise.reject(new Error(r.msg || "Error"));
  },
)
// 默认导出 Axios 实例对象
export default instance;
